package com.study.lambda;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;

/**
 * @author yangyb
 * <p>
 * <p>
 * java 内置4大h核心函数式接口
 * 消费型接口 Consumer<T>    void accept(T t)
 * 供给型接口 Supplier<T>    T get()
 * 函数式接口 Function<T,R>  R apply(T t)
 * 断定型接口 Predicate<T>   boolean test (T t)
 */
public class LambdaTest2 {
    @Test
    public void test1() {

        // 2、通过重写accept()实现
        happyTime(3000, new Consumer<Double>() {
            @Override
            public void accept(Double aDouble) {
                System.out.println("取消费了" + aDouble);
            }
        });

        System.out.println("**************");

        // 2、通过lambda表达式使用消费型接口的方法（推荐）
        happyTime(30000, money -> System.out.println("花费了" + money));

    }

    // 定义消费型接口的方法
    public void happyTime(double money, Consumer<Double> con) {
        con.accept(money);
    }

    @Test
    public void test2() {
        List<String> stringList = Arrays.asList("北京", "天津", "南京", "东京", "西京");
        List<String> filterStr = filterString(stringList, new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.contains("京");
            }
        });
        System.out.println(filterStr);
        System.out.println("******************");
        List<String> filter = filterString(stringList, s -> s.contains("京"));
        System.out.println(filter);

    }

    //依据给定的规则，过滤出集合中的字符串，由Predicte的方法决定
    public List<String> filterString(List<String> list, Predicate<String> predicate) {
        List<String> filterList = new ArrayList<>();
        for (String s : list) {
            if (predicate.test(s)) {
                filterList.add(s);
            }

        }
        return filterList;
    }

}
